home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS16.ADF / C / FileZap3 / _main.c next >
C/C++ Source or Header  |  1989-01-27  |  3KB  |  143 lines

  1. /*    _main.c        Copyright (C) 1985  Lattice, Inc.    */
  2.  
  3. #include "stdio.h"
  4. #include "ios1.h"
  5.  
  6. #include "workbench/startup.h"
  7. #include "libraries/dos.h"
  8. #include "libraries/dosextens.h"
  9.  
  10. #define MAXARG 32              /* maximum command line arguments */
  11. #define QUOTE  '"'
  12.  
  13. #define isspace(c)    ((c == ' ')||(c == '\t') || (c == '\n'))
  14.  
  15. #ifndef TINY
  16. extern int _stack,_fmode,_iomode;
  17. extern int (*_ONBREAK)();
  18. extern int CXBRK();
  19. #endif
  20. extern int LoadAddress;
  21.  
  22. extern struct UFB _ufbs[];
  23. int argc;            /* arg count */
  24. char *targv, *argv[MAXARG];    /* arg pointers */
  25.  
  26. #define MAXWINDOW 40
  27. extern struct WBStartup *WBenchMsg;
  28. /* static char window[MAXWINDOW] = "con:10/10/320/80/"; */
  29. static struct Process *process, *FindTask();
  30. static struct FileHandle *handle;
  31.  
  32. /**
  33. *
  34. * name         _main - process command line, open files, and call "main"
  35. *
  36. * synopsis     _main(line);
  37. *              char *line;     ptr to command line that caused execution
  38. *
  39. * description    This function performs the standard pre-processing for
  40. *        the main module of a C program.  It accepts a command
  41. *        line of the form
  42. *
  43. *            pgmname arg1 arg2 ...
  44. *
  45. *        and builds a list of pointers to each argument.  The first
  46. *        pointer is to the program name.  For some environments, the
  47. *        standard I/O files are also opened, using file names that
  48. *        were set up by the OS interface module XCMAIN.
  49. *
  50. **/
  51. void _main(line)
  52. register char *line;
  53. {
  54. register char **pargv;
  55. register int x;
  56.  
  57. /*
  58. *
  59. * Build argument pointer list
  60. *
  61. */
  62. while (argc < MAXARG)
  63.     {
  64.     while (isspace(*line))    line++;
  65.     if (*line == '\0')    break;
  66.     pargv = &argv[argc++];
  67.     if (*line == QUOTE)
  68.         {
  69.         *pargv = ++line;  /* ptr inside quoted string */
  70.         while ((*line != '\0') && (*line != QUOTE)) line++;
  71.         if (*line == '\0')  _exit(1);
  72.         else            *line++ = '\0';  /* terminate arg */
  73.         }
  74.     else        /* non-quoted arg */
  75.         {     
  76.         *pargv = line;
  77.         while ((*line != '\0') && (!isspace(*line))) line++;
  78.         if (*line == '\0')  break;
  79.         else             *line++ = '\0';  /* terminate arg */
  80.         }
  81.     }  /* while */
  82. targv = (argc == 0) ? (char *)WBenchMsg : (char *)&argv[0];
  83.  
  84.  
  85. /*
  86. *
  87. * Open standard files
  88. *
  89. */
  90. #ifndef TINY
  91.  
  92. if (argc == 0)        /* running under workbench    */
  93.     {
  94.     strncat(window, WBenchMsg->sm_ArgList->wa_Name,MAXWINDOW);
  95.     _ufbs[0].ufbfh = Open(window,MODE_NEWFILE);
  96.     _ufbs[1].ufbfh = _ufbs[0].ufbfh;
  97.     _ufbs[1].ufbflg = UFB_NC;
  98.     _ufbs[2].ufbfh = _ufbs[0].ufbfh;
  99.     _ufbs[2].ufbflg = UFB_NC;
  100.     handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);
  101.     process = FindTask(0);
  102.     process->pr_ConsoleTask = handle->fh_Type;
  103.     x = 0;
  104.     }
  105. else            /* running under CLI        */
  106.     {
  107.     _ufbs[0].ufbfh = Input();
  108.     _ufbs[1].ufbfh = Output();
  109.     _ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
  110.     x = UFB_NC;            /* do not close CLI defaults    */
  111.     }
  112.  
  113. _ufbs[0].ufbflg |= UFB_RA | x;
  114. _ufbs[1].ufbflg |= UFB_WA | x;
  115. _ufbs[2].ufbflg |= UFB_WA ;
  116.  
  117. stdin->_file = _ufbs[0].ufbfh;
  118. stdin->_flag = _IOREAD;
  119. stdout->_file = _ufbs[1].ufbfh;
  120. stdout->_flag = _IOWRT;
  121. stderr->_file = _ufbs[2].ufbfh;
  122. stderr->_flag = _IOWRT;
  123.  
  124. /*    establish control-c handler */
  125.  
  126. _ONBREAK = CXBRK;
  127.  
  128. #endif
  129.  
  130. /*
  131. *
  132. * Call user's main program
  133. *
  134. */
  135.  
  136. main(argc,targv);              /* call main function */
  137. #ifndef TINY
  138. exit(0);
  139. #else
  140. _exit(0);
  141. #endif
  142. }
  143.